import time
import cv2
import numpy as np
# 安装 paddleocr库
# python -m pip install paddlepaddle==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
from paddleocr import PaddleOCR
from PIL import Image, ImageDraw, ImageFont


# 文字识别初始化
ocr = PaddleOCR(use_angle_cls=True, lang="ch")

# 摄像头初始化
frameWidth = 1280
frameHeight = 720
cap = cv2.VideoCapture(0)    # 0就是第一个摄像头，你要有多个的话，按顺序排就行
cap.set(cv2.CAP_PROP_FRAME_WIDTH, frameWidth)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frameHeight)
cap.set(cv2.CAP_PROP_BRIGHTNESS, 50)



while True:
    # 捕获摄像头
    success, img = cap.read()
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    #####################

    # 对捕获的视频流做文字识别
    result = ocr.ocr(img, cls=True)
    if result[0] == None:
        print("没有识别到文字，请重试...")
    else:
        # 识别内容初步处理
        boxes = [x[0] for x in result[0]]  # 文字位置
        texts = [x[1][0] for x in result[0]]  # 文字
        scores = [x[1][1] for x in result[0]]  # 打分

        # 图片初步处理
        pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 生成PIL.Image对象
        draw = ImageDraw.Draw(pil_img)  # 对目标对象添加画图操作
        font = ImageFont.truetype('simsun.ttc', 12)  # 'simsun.ttc' 是常见的中文字体

        # PIL方式
        for idx, box in zip(range(len(boxes)), boxes):
            # 文本位置框选
            x = [x[0] for x in box]  # x轴坐标列表
            y = [x[1] for x in box]  # y轴坐标列表

            x0 = int(min(x))
            y0 = int(min(y))
            x1 = int(max(x))
            y1 = int(max(y))

            # 使用PIL框选文字位置
            draw.rectangle(((x0, y0), (x1, y1)),  # PIL中的矩形绘图采用的是左上、右下对角线坐标。
                           outline=(0, 255, 0),  # 接受RGB编码
                           width=1)  # 线宽

            # 使用PIL框选添加文字信息
            draw.text((int(box[0][0]), int(box[0][1]) - 10),
                      texts[idx],
                      font=font,
                      fill=(0, 255, 0))
        # 将PIL图像转换回OpenCV图像格式
        img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
    # 显示图片
    winname = "Scanning"
    cv2.namedWindow(winname)
    cv2.imshow(winname, img)
    time.sleep(0.01)
    #####################


# 释放摄像头
cap.release()
# 释放窗口
cv2.destroyAllWindows()






